package dvlp.jhlee.myhomeinventory.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.PreparedQuery.TooManyResultsException;

import dvlp.jhlee.myhomeinventory.meta.UserMeta;
import dvlp.jhlee.myhomeinventory.model.User;

/**
 * ユーザテーブル用dao
 * @author
 *
 */
public class UserDao extends ServerDaoBase<User>{

    /** id-表示名map ：　TODOF:今回は処理簡略化のためMAPで対応する */
    protected Map<Long, String> userMap = null;
    
    private String nameOfLoginId;

    {
        UserMeta meta = UserMeta.get();
        nameOfLoginId = meta.loginId.getName();
    }


    // **** 固有メソッド
    
    /**
     * ログイン用IDからユーザテーブルレコードを取得する
     * @param loginId
     * @return 存在しない場合はnull
     */
    public User getUserModel(String loginId) {
        User model = null;
        try {
            model = query()
                    .filter(nameOfLoginId, Query.FilterOperator.EQUAL, loginId)
                    .asSingle();
        } catch(TooManyResultsException e) {
            // TODOF: データ不整合（本来は例外処理すべきだが、処理省略）
            return null;
        }
        if (model == null) {
            return null;
        }
        return model;
    }
    
    /**
     * id-表示名をmap形式で取得する
     * @return
     */
    public Map<Long, String> getUserMap() {
        if (this.userMap != null) {
            // すでに取得済み
            return this.userMap;
        }

        this.userMap = new HashMap<Long, String>();
        List<User> modelList = getAll();
        if (modelList == null) {
            return this.userMap;
        }
        // mapに詰め替え
        for (User model: modelList) {
            this.userMap.put(Long.valueOf(model.getId()), model.getName());
        }
        
        return this.userMap;
    }
    

    // **** イベント処理

    /**
     * データ追加時の処理
     * @param key
     */
    @Override
    protected void onInserted(Key key){
        // ID-カテゴリ名mapの再取得（予約）
        this.userMap = null;

        super.onInserted(key);
    }

    /**
     * データ更新時の処理
     * @param key
     */
    @Override
    protected void onUpdated(Key key){
        // ID-カテゴリ名mapの再取得（予約）
        this.userMap = null;

        super.onUpdated(key);
    }

    /**
     * データ論理削除時の処理
     * @param key
     */
    @Override
    protected void onDeleted(Key key){
        // ID-カテゴリ名mapの再取得（予約）
        this.userMap = null;

        super.onDeleted(key);
    }

    /**
     * データ物理削除時の処理
     * @param key
     */
    @Override
    protected void onVanished(Key key){
        // ID-カテゴリ名mapの再取得（予約）
        this.userMap = null;

        super.onVanished(key);
    }

}
